package com.easygem.common.utils;


import com.easygem.common.vo.system.DeptNodeVO;

import java.util.ArrayList;
import java.util.List;

/**
 * 该类用于递归构建树形部门
 * Created by 文晓平 on 2024/12/25 15:34
 */
public class DeptTreeBuilder {


    /**
     * 构建多级部门树
     * @param nodes  所有部门节点
     * @param dept 当前登录所在部门
     * @return
     */
    public static List<DeptNodeVO> build(List<DeptNodeVO> nodes, DeptNodeVO dept) {
        //根节点
        List<DeptNodeVO> rootDept = new ArrayList<>();
        rootDept.add(dept);
//        for (DeptNodeVO nav : nodes) {
//            if(nav.getParentId()==0){
//                rootDept.add(nav);
//            }
//        }
        /*为根菜单设置子菜单，getChild是递归调用的*/
        for (DeptNodeVO nav : rootDept) {
            /* 获取根节点下的所有子节点 使用getChild方法*/
            List<DeptNodeVO> childList = getChild(nav.getDeptId(), nodes);
            nav.setChildren(childList);//给根节点设置子节点
        }
        return rootDept;
    }

    public static List<DeptNodeVO> build(List<DeptNodeVO> nodes) {
        //根节点
        List<DeptNodeVO> rootDept = new ArrayList<>();
        for (DeptNodeVO nav : nodes) {
            if(nav.getParentId()==0){
                rootDept.add(nav);
            }
        }
        /*为根菜单设置子菜单，getChild是递归调用的*/
        for (DeptNodeVO nav : rootDept) {
            /* 获取根节点下的所有子节点 使用getChild方法*/
            List<DeptNodeVO> childList = getChild(nav.getDeptId(), nodes);
            nav.setChildren(childList);//给根节点设置子节点
        }
        return rootDept;
    }

    /**
     * 获取子菜单
     * @param id
     * @param nodes
     * @return
     */
    private static List<DeptNodeVO> getChild(Long id, List<DeptNodeVO> nodes) {
        //子菜单
        List<DeptNodeVO> childList = new ArrayList<DeptNodeVO>();

        for (DeptNodeVO nav : nodes) {
            // 遍历所有节点，将所有菜单的父id与传过来的根节点的id比较
            //相等说明：为该根节点的子节点。
            if(nav.getParentId().equals(id)){
                childList.add(nav);
            }

        }
        //递归
        for (DeptNodeVO nav : childList) {
            nav.setChildren(getChild(nav.getDeptId(), nodes));
        }
        //如果节点下没有子节点，返回一个空List（递归退出）
        if(childList.size() == 0){
            return new ArrayList<DeptNodeVO>();
        }
        return childList;
    }


}
